home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
051-060
/
amok52
/
gadgeted
/
txt
/
gadgets.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
22KB
|
778 lines
(*----------------------------------------------------------------------
:Program. Gadgets.mod
:Contents. Aufbau und Verwaltung von Gadgets
:Author. Hubert Bildstein
:Address. Gehenbühlstr.5, W7000 Stuttgart 31, Germany
:Copyright. Public Domain
:Language. Modula-2
:Translator. M2Amiga V3.3d
:History. V1.0 6.12.1990
:Remark. Evtl. Namensgleichheit mit schon vorhandenen Modulen
:Remark. ist zufällig
----------------------------------------------------------------------*)
IMPLEMENTATION MODULE Gadgets;
(*--------------------------------------------------------------------------*)
(* Prozeduren zur Behandlung von String- und BooleanGadgets *)
(* *)
(* Datum: 26.07.90 letzte Änderung: 06.12.1990 *)
(* Autor: Hubert Bildstein *)
(* Compiler: M2Amiga V3.3d *)
(*--------------------------------------------------------------------------*)
FROM SYSTEM IMPORT ADR, ADDRESS;
FROM ASCII IMPORT nul;
FROM Conversions IMPORT ValToStr;
FROM Exec IMPORT GetMsg, ReplyMsg, WaitPort;
FROM Graphics IMPORT jam1, jam2;
FROM Intuition IMPORT GadgetPtr, WindowPtr, GadgetFlagSet,GadgetFlags,
ActivationFlagSet,ActivationFlags,
IDCMPFlagSet, IDCMPFlags,
Gadget,strGadget,boolGadget,propGadget,Border,
BorderPtr,IntuiText,IntuiTextPtr,StringInfo,PropInfo,
PropInfoFlagSet, PropInfoFlags,
AddGadget, RemoveGadget, RefreshGadgets,
IntuiMessagePtr, StringInfoPtr;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
FROM Str IMPORT Copy, Length;
CONST MaxString = 255;
MaxPropSteps = 65535;
TYPE StrType = ARRAY [0..MaxString] OF CHAR;
StrTypePtr = POINTER TO StrType;
StrGadgetType = RECORD
GadgetRecord : Gadget;
Info : StringInfo;
Buffer : StrType;
END; (*RECORD*)
StrGadgetTypePtr = POINTER TO StrGadgetType;
BoolGadgetType = RECORD
GadgetRecord : Gadget;
END; (*RECORD*)
BoolGadgetTypePtr = POINTER TO BoolGadgetType;
PropGadgetType = RECORD
GadgetRecord : Gadget;
Info : PropInfo;
Rahmen : Border;
END; (*RECORD*)
PropGadgetTypePtr = POINTER TO PropGadgetType;
VAR WPtr : WindowPtr; (* enthält Zeiger auf Window, mit dem gearbeitet
werden soll *)
UBuffer : StrType; (* allgemeiner Undo-Buffer für String-Gadgets *)
(*--------------------------------------------------------------------------*)
PROCEDURE DefineWindow (GWindow : WindowPtr);
(* Arbeitswindow festlegen *)
BEGIN
WPtr := GWindow;
END DefineWindow;
(*--------------------------------------------------------------------------*)
PROCEDURE MakeStrGadget (VAR GPtr : GadgetPtr;
GadgID : INTEGER;
x, y : INTEGER;
w, h : INTEGER;
MaxChars : INTEGER;
Flags : GadgetFlagSet;
AFlags : ActivationFlagSet;
VAR ok : BOOLEAN);
(* Aufbau eines Stringgadgets, Darstellung im angegebenen Window *)
VAR Ptr : StrGadgetTypePtr;
Pos : INTEGER;
BEGIN
(* Parameter sinnvoll? *)
IF (GadgID<0) OR (x<0) OR (y<0) OR (w<0) OR (MaxChars<1) OR
(MaxChars > MaxString) OR (WPtr = NIL)
THEN
GPtr := NIL;
ok := FALSE;
RETURN;
END; (*IF*)
(* Speicher belegen: *)
ALLOCATE (Ptr,SIZE(StrGadgetType));
(* Gadgetinformationen eintragen: *)
(*--------------------------------*)
(* Gadget - Record *)
WITH Ptr^.GadgetRecord DO
nextGadget := NIL;
leftEdge := x; topEdge := y; width := w; height := h;
flags := Flags; activation := AFlags;
gadgetType := strGadget;
gadgetRender := NIL; selectRender := NIL; gadgetText := NIL;
specialInfo := ADR(Ptr^.Info);
gadgetID := GadgID; userData := NIL;
END; (*WITH*)
Ptr^.Buffer := nul;
(* StringInfo - Record *)
WITH Ptr^.Info DO
buffer := ADR(Ptr^.Buffer);
undoBuffer := ADR(UBuffer);
bufferPos := 0; maxChars := MaxChars;
dispPos := 0; longInt := 0;
END; (*WITH*)
(* GadgetPtr ermitteln *)
GPtr := ADR(Ptr^.GadgetRecord);
(* Gadget in Window einbauen: *)
Pos := AddGadget (WPtr,GPtr,0);
(* Darstellen *)
RefreshGadgets (GPtr,WPtr,NIL);
ok := TRUE;
END MakeStrGadget;
(*--------------------------------------------------------------------------*)
PROCEDURE MakeBoolGadget (VAR GPtr : GadgetPtr;
GadgID : INTEGER;
x, y : INTEGER;
w, h : INTEGER;
Flags : GadgetFlagSet;
AFlags : ActivationFlagSet;
VAR ok : BOOLEAN);
(* Boolean-Gadget erstellen und im Window darstellen *)
VAR Ptr : BoolGadgetTypePtr;
Pos : INTEGER;
BEGIN
(* Parameter sinnvoll? *)
IF (GadgID<0) OR (x<0) OR (y<0) OR (w<0) OR (h<0) OR (WPtr = NIL) THEN
GPtr := NIL;
ok := FALSE;
RETURN;
END; (*IF*)
(* Speicher belegen: *)
ALLOCATE (Ptr,SIZE(BoolGadgetType));
(* Gadgetinformationen eintragen: *)
(*--------------------------------*)
(* Gadget - Record *)
WITH Ptr^.GadgetRecord DO
nextGadget := NIL;
leftEdge := x; topEdge := y; width := w; height := h;
flags := Flags; activation := AFlags;
gadgetType := boolGadget;
gadgetRender := NIL; selectRender := NIL; gadgetText := NIL;
specialInfo := NIL;
gadgetID := GadgID; userData := NIL;
END; (*WITH*)
(* GadgetPtr zurückgeben *)
GPtr := ADR(Ptr^.GadgetRecord);
(* Gadget in Window einbauen: *)
Pos := AddGadget (WPtr,GPtr,0);
(* Darstellen *)
RefreshGadgets (GPtr,WPtr,NIL);
ok := TRUE;
END MakeBoolGadget;
(*--------------------------------------------------------------------------*)
PROCEDURE MakePropGadget (VAR GPtr : GadgetPtr;
GadgID : INTEGER;
x, y : INTEGER;
w, h : INTEGER;
AFlags : ActivationFlagSet;
Type : PropTypeSet;
HSteps : CARDINAL;
VSteps : CARDINAL;
VAR ok : BOOLEAN);
(* Erzeugt ein Proportional-Gadget im angegebenen Window *)
VAR Ptr : PropGadgetTypePtr;
Pos : INTEGER;
PFlags : PropInfoFlagSet;
BEGIN
(* Parameter sinnvoll? *)
IF (GadgID<0) OR (x<0) OR (y<0) OR (w<0) OR (h<0) OR
(Type = PropTypeSet{}) OR (WPtr = NIL) THEN
GPtr := NIL;
ok := FALSE;
RETURN;
END; (*IF*)
(* Speicher belegen: *)
ALLOCATE (Ptr,SIZE(PropGadgetType));
(* Gadgetinformationen eintragen: *)
(*--------------------------------*)
(* Gadget - Record *)
WITH Ptr^.GadgetRecord DO
nextGadget := NIL;
leftEdge := x; topEdge := y; width := w; height := h;
flags := GadgetFlagSet{}; activation := AFlags;
gadgetType := propGadget; gadgetRender := ADR(Ptr^.Rahmen);
selectRender := NIL; gadgetText := NIL;
specialInfo := ADR(Ptr^.Info);
gadgetID := GadgID; userData := NIL;
END; (*WITH*)
(* Typ des Gadgets auswerten *)
PFlags := PropInfoFlagSet{autoKnob};
IF (Horiz IN Type) THEN
INCL (PFlags,freeHoriz);
END; (*IF*)
IF (Vert IN Type) THEN
INCL (PFlags,freeVert);
END; (*IF*)
(* PropInfo - Record *)
WITH Ptr^.Info DO
flags := PFlags;
horizPot := 0; vertPot := 0;
IF (HSteps <= 1) THEN
horizBody := MaxPropSteps;
ELSE
horizBody := MaxPropSteps DIV HSteps + 1;
END; (*IF*)
IF (VSteps <= 1) THEN
vertBody := MaxPropSteps;
ELSE
vertBody := MaxPropSteps DIV VSteps + 1;
END; (*IF*)
END; (*WITH*)
(* Rahmen, Inhalt wird ignoriert, muß aber vorhanden sein! *)
WITH Ptr^.Rahmen DO
leftEdge := -1; topEdge := -1; frontPen := 1; backPen := 0;
drawMode := jam1;
count := 0; xy := NIL; (* Rahmen wird automatisch gezeichnet *)
nextBorder := NIL;
END; (*WITH*)
(* GadgetPtr zurückgeben *)
GPtr := ADR(Ptr^.GadgetRecord);
(* Gadget in Window einbauen: *)
Pos := AddGadget (WPtr,GPtr,0);
(* Darstellen *)
RefreshGadgets (GPtr,WPtr,NIL);
ok := TRUE;
END MakePropGadget;
(*--------------------------------------------------------------------------*)
PROCEDURE WaitForGadget (VAR class : IDCMPFlagSet;
VAR ID : INTEGER;
VAR GPtr : GadgetPtr);
(* Warten auf Message vom Window, evtl. wird Nummer des aktivierten Gadgets
zurückgegeben, sonst -1 *)
VAR IMsg : IntuiMessagePtr;
BEGIN
IF (WPtr # NIL) THEN
WaitPort (WPtr^.userPort);
IMsg := GetMsg (WPtr^.userPort);
class := IMsg^.class;
IF (gadgetUp IN class) OR (gadgetDown IN class) THEN
GPtr := IMsg^.iAddress;
ID := GPtr^.gadgetID;
ELSE
ID := -1;
END; (*IF*)
ReplyMsg (IMsg);
ELSE
class := IDCMPFlagSet{}; ID := -1; GPtr := NIL;
END; (*IF*)
END WaitForGadget;
(*--------------------------------------------------------------------------*)
(* Typen für Text *)
TYPE TextType = RECORD
iTextRecord : IntuiText;
textString : StrType;
END; (*RECORD*)
TextTypePtr = POINTER TO TextType;
PROCEDURE GadgetText (GPtr : GadgetPtr;
relX, relY : INTEGER;
Text : ARRAY OF CHAR;
fPen, bPen : INTEGER);
(* Versieht ein Gadget mit einem Text *)
VAR Ptr : TextTypePtr;
GText : IntuiTextPtr;
TextPtr : StrTypePtr;
Dummy : ADDRESS;
BEGIN
IF (WPtr = NIL) OR (GPtr = NIL) THEN RETURN END;
IF (HIGH(Text) >= MaxString) THEN (* Text zu lang? *)
Text[MaxString] := nul;
END; (*IF*)
IF (GPtr^.gadgetText # NIL) THEN (* Text bereits vorhanden? *)
GText := GPtr^.gadgetText;
TextPtr := GText^.iText;
ELSE
ALLOCATE (Ptr, SIZE(TextType)); (* Speicher holen *)
Dummy := Ptr;
GText := Dummy;
TextPtr := ADR(Ptr^.textString);
END; (*IF*)
Copy (TextPtr^,Text);
WITH GText^ DO
frontPen := fPen;
backPen := bPen;
drawMode := jam2;
leftEdge := relX; topEdge := relY;
iTextFont := NIL;
iText := TextPtr;
nextText := NIL;
END; (*WITH*)
(* Text anhängen *)
GPtr^.gadgetText := GText;
(* Gadget neu zeichnen *)
RefreshGadgets (GPtr, WPtr, NIL);
END GadgetText;
(*--------------------------------------------------------------------------*)
PROCEDURE DeleteText (GPtr : GadgetPtr);
(* Löschen des Gadget-Textes *)
VAR GText : IntuiTextPtr;
BEGIN
IF (WPtr # NIL) AND (GPtr # NIL) THEN
GText := GPtr^.gadgetText;
IF (GText # NIL) THEN
DEALLOCATE (GText, SIZE(TextType)); (* muß mit GadgetText erstellt *)
GPtr^.gadgetText := NIL; (* worden sein! *)
END; (*IF*)
END; (*IF*)
END DeleteText;
(*--------------------------------------------------------------------------*)
(* Typen für Rahmen *)
TYPE BorderArray = ARRAY [0..9] OF INTEGER;
BorderType = RECORD
GadgetBorder : Border;
XY : BorderArray;
END; (*RECORD*)
BorderTypePtr = POINTER TO BorderType;
PROCEDURE GadgetBorder (GPtr : GadgetPtr;
relX, relY : INTEGER;
w, h : INTEGER;
Double : BOOLEAN;
xDist, yDist : INTEGER;
Colour : INTEGER);
(* versieht Gadget mit einem einfachen/doppelten Rahmen *)
VAR RPtr1, RPtr2 : BorderTypePtr;
BPtr : BorderPtr;
Dummy : ADDRESS;
BEGIN
IF (WPtr = NIL) OR (GPtr = NIL) THEN RETURN END;
IF (GPtr^.gadgetRender = NIL) THEN (* Schon Rahmen vorhanden? *)
(* Speicher reservieren *) (* nein, also neu belegen *)
ALLOCATE (RPtr1,SIZE(BorderType));
IF (Double) THEN
ALLOCATE (RPtr2,SIZE(BorderType));
END; (*IF*)
ELSE (* Rahmen bereits vorhanden *)
RPtr1 := GPtr^.gadgetRender; (* vorhandenen Rahmen übernehmen *)
(* VORSICHT! Vorhandener Rahmen muß auch schon von GadgetBorder erzeugt
worden sein! *)
BPtr := GPtr^.gadgetRender;
IF (Double) AND (BPtr^.nextBorder = NIL) THEN
ALLOCATE (RPtr2,SIZE(BorderType));
ELSIF (Double) AND (BPtr^.nextBorder # NIL) THEN
Dummy := BPtr^.nextBorder; (* VORSICHT! s.o. *)
RPtr2 := Dummy;
END; (*IF*)
END; (*IF*)
(* Werte eintragen: *)
WITH RPtr1^.GadgetBorder DO
leftEdge := relX; topEdge := relY;
frontPen := Colour; backPen := 0;
drawMode := jam1;
count := 5; xy := ADR(RPtr1^.XY);
IF (Double) THEN
nextBorder := ADR(RPtr2^.GadgetBorder);
ELSE
nextBorder := NIL;
END; (*IF*)
END; (*WITH*)
(* Rahmenkoordinaten *)
WITH RPtr1^ DO
XY[0] := 0; XY[1] := 0; XY[2] := w; XY[3] := 0;
XY[4] := w; XY[5] := h; XY[6] := 0; XY[7] := h;
XY[8] := 0; XY[9] := 0;
END; (*WITH*)
IF (Double) THEN
WITH RPtr2^.GadgetBorder DO
leftEdge := relX-xDist; topEdge := relY-yDist;
frontPen := Colour; backPen := 0;
drawMode := jam1;
count := 5; xy := ADR(RPtr2^.XY);
nextBorder := NIL;
END; (*WITH*)
(* Rahmenkoordinaten: *)
WITH RPtr2^ DO
XY[0] := 0; XY[1] := 0; XY[2] := w+2*xDist; XY[3] := 0;
XY[4] := w+2*xDist; XY[5] := h+2*yDist;
XY[6] := 0; XY[7] := h+2*yDist;
XY[8] := 0; XY[9] := 0;
END; (*WITH*)
END; (*IF*)
(* Rahmen dem Gadget anfügen *)
GPtr^.gadgetRender := RPtr1;
(* Gadget neu zeichnen *)
RefreshGadgets (GPtr, WPtr, NIL);
END GadgetBorder;
(*--------------------------------------------------------------------------*)
PROCEDURE DeleteBorder (GPtr : GadgetPtr);
(* Löschen des GadgetBorders *)
(*--------------------------------------*)
PROCEDURE DelBorder (BPtr : BorderPtr); (* rekursiv löschen *)
BEGIN
IF (BPtr # NIL) THEN
DelBorder (BPtr^.nextBorder);
DEALLOCATE (BPtr,SIZE(BorderType));
END; (*IF*)
END DelBorder;
(*--------------------------------------*)
BEGIN
IF (WPtr # NIL) AND (GPtr # NIL) AND (GPtr^.gadgetType # propGadget) THEN
DelBorder (GPtr^.gadgetRender);
GPtr^.gadgetRender := NIL;
END; (*IF*)
END DeleteBorder;
(*--------------------------------------------------------------------------*)
PROCEDURE DeleteGadget (VAR GPtr : GadgetPtr);
(* Löschen eines Gadgets aus der Windowliste und aus dem Speicher.
Neuaufbau des Fensters muß selbst erledigt werden.
ACHTUNG! Das Gadget muß von diesem Modul erstellt worden sein,
sonst ist ein Absturz fast sicher! *)
VAR Pos : INTEGER;
BEGIN
IF (WPtr # NIL) AND (GPtr # NIL) THEN
Pos := RemoveGadget (WPtr,GPtr); (* Aus Liste entfernen *)
(* Speicher freigeben: *)
(*---------------------*)
(* Text *)
DeleteText (GPtr);
(* Rahmen *)
IF (GPtr^.gadgetType # propGadget) THEN
DeleteBorder (GPtr);
END; (*IF*)
(* Gadget *)
IF (GPtr^.gadgetType = strGadget) THEN
DEALLOCATE (GPtr,SIZE(StrGadgetType));
ELSIF (GPtr^.gadgetType = boolGadget) THEN
DEALLOCATE (GPtr,SIZE(BoolGadgetType));
ELSIF (GPtr^.gadgetType = propGadget) THEN
DEALLOCATE (GPtr,SIZE(PropGadgetType));
END; (*IF*)
GPtr := NIL;
END; (*IF*)
END DeleteGadget;
(*--------------------------------------------------------------------------*)
PROCEDURE ReadStrGadget ( GPtr : GadgetPtr;
VAR Str : ARRAY OF CHAR);
(* Liest das angegebenen StringGadget aus und gibt den Inhalt zurück *)
VAR SIPtr : StringInfoPtr;
TextPtr : StrTypePtr;
BEGIN
IF (GPtr^.gadgetType = strGadget) THEN
SIPtr := GPtr^.specialInfo;
TextPtr := SIPtr^.buffer;
Copy (Str,TextPtr^);
ELSE
Str := nul;
END; (*IF*)
END ReadStrGadget;
(*--------------------------------------------------------------------------*)
PROCEDURE SetStrGadget (GPtr : GadgetPtr;
Buffer : ARRAY OF CHAR);
(* Belegt den Inhalt eines StringGadgets mit der angegebenen Zeichenkette *)
VAR SIPtr : StringInfoPtr;
TextPtr : StrTypePtr;
BEGIN
IF (GPtr^.gadgetType = strGadget) AND (WPtr # NIL) THEN
SIPtr := GPtr^.specialInfo;
IF (stringCenter IN GPtr^.activation) THEN
SIPtr^.bufferPos := Length(Buffer) DIV 2;
SIPtr^.dispPos := SIPtr^.bufferPos - (SIPtr^.dispCount DIV 2);
ELSIF (stringRight IN GPtr^.activation) THEN
SIPtr^.bufferPos := Length(Buffer);
SIPtr^.dispPos := SIPtr^.bufferPos - SIPtr^.dispCount;
ELSE
SIPtr^.bufferPos := 0;
SIPtr^.dispPos := 0;
END; (*IF*)
TextPtr := SIPtr^.buffer;
Copy (TextPtr^,Buffer);
RefreshGadgets (GPtr,WPtr,NIL);
END; (*IF*)
END SetStrGadget;
(*--------------------------------------------------------------------------*)
PROCEDURE ReadLongint ( GPtr : GadgetPtr;
VAR Value : LONGINT);
(* Liest den Inhalt eines LONGINT-String-Gadgets aus *)
VAR SIPtr : StringInfoPtr;
BEGIN
IF (GPtr^.gadgetType = strGadget) AND (longint IN GPtr^.activation) THEN
SIPtr := GPtr^.specialInfo;
Value := SIPtr^.longInt;
ELSE
Value := 0;
END; (*IF*)
END ReadLongint;
(*--------------------------------------------------------------------------*)
PROCEDURE SetLongint (GPtr : GadgetPtr;
Value : LONGINT);
(* Setzt den Inhalt eines LONGINT-String-Gadgets auf den angegebenen Wert *)
VAR String : ARRAY [1..12] OF CHAR;
err : BOOLEAN;
SIPtr : StringInfoPtr;
BEGIN
IF (GPtr^.gadgetType = strGadget) AND (longint IN GPtr^.activation) THEN
SIPtr := GPtr^.specialInfo;
SIPtr^.longInt := Value;
ValToStr (Value,TRUE,String,10,-11,nul,err);
SetStrGadget (GPtr,String);
END; (*IF*)
END SetLongint;
(*--------------------------------------------------------------------------*)
PROCEDURE ReadPropGadget ( GPtr : GadgetPtr;
VAR xValue : CARDINAL;
VAR yValue : CARDINAL);
(* Liest die Stellung eines Schiebereglers aus *)
VAR PInfoPtr : POINTER TO PropInfo;
BEGIN
IF (GPtr^.gadgetType = propGadget) THEN
PInfoPtr := GPtr^.specialInfo;
WITH PInfoPtr^ DO
IF (freeHoriz IN flags) THEN
xValue := horizPot DIV horizBody;
ELSE
xValue := 0;
END; (*IF*)
IF (freeVert IN flags) THEN
yValue := vertPot DIV vertBody;
ELSE
yValue := 0;
END; (*IF*)
END; (*WITH*)
ELSE
xValue := 0; yValue := 0;
END; (*IF*)
END ReadPropGadget;
(*--------------------------------------------------------------------------*)
PROCEDURE SetPropGadget (GPtr : GadgetPtr;
xValue : CARDINAL;
yValue : CARDINAL);
(* Setzen eines Proportional-Gadgets auf einen bestimmten Wert *)
VAR PInfoPtr : POINTER TO PropInfo;
AnzV, AnzH : CARDINAL;
newVBody,newHBody : CARDINAL;
BEGIN
IF (GPtr^.gadgetType = propGadget) AND (WPtr # NIL) THEN
PInfoPtr := GPtr^.specialInfo;
WITH PInfoPtr^ DO
IF (freeHoriz IN flags) THEN
IF (horizBody <= 1) THEN
AnzH := MaxPropSteps - 1;
ELSE
AnzH := MaxPropSteps DIV (horizBody - 1);
END; (*IF*)
newHBody := MaxPropSteps DIV (AnzH - 1);
horizPot := xValue * newHBody;
END; (*IF*)
IF (freeVert IN flags) THEN
IF (vertBody <= 1) THEN
AnzV := MaxPropSteps - 1;
ELSE
AnzV := MaxPropSteps DIV (vertBody - 1);
END; (*IF*)
newVBody := MaxPropSteps DIV (AnzV - 1);
vertPot := yValue * newVBody;
END; (*IF*)
END; (*WITH*)
RefreshGadgets (GPtr, WPtr, NIL);
END; (*IF*)
END SetPropGadget;
(*--------------------------------------------------------------------------*)
PROCEDURE ReadToggleSelect ( GPtr : GadgetPtr;
VAR Selected : BOOLEAN);
(* Abfragen eines ToggleSelect-Boolean-Gadgets. *)
BEGIN
IF (WPtr # NIL) AND (GPtr^.gadgetType = boolGadget) AND
(toggleSelect IN GPtr^.activation) THEN
Selected := (selected IN GPtr^.flags);
END; (*IF*)
END ReadToggleSelect;
(*--------------------------------------------------------------------------*)
PROCEDURE SetToggleSelect (GPtr : GadgetPtr;
Select : BOOLEAN);
(* Setzen eines ToggleSelect-Boolean-Gadgets. *)
BEGIN
IF (WPtr # NIL) AND (GPtr^.gadgetType = boolGadget) AND
(toggleSelect IN GPtr^.activation) THEN
IF (Select) AND NOT (selected IN GPtr^.flags) THEN
INCL (GPtr^.flags,selected);
RefreshGadgets (GPtr, WPtr, NIL);
ELSIF (NOT Select) AND (selected IN GPtr^.flags) THEN
EXCL (GPtr^.flags,selected);
RefreshGadgets (GPtr, WPtr, NIL);
END; (*IF*)
END; (*IF*)
END SetToggleSelect;
(*--------------------------------------------------------------------------*)
BEGIN (* Initialisierung *)
WPtr := NIL;
END Gadgets.